package com.rem.designPattern.state状态;

/**
 * 抽象动态类
 *
 * @author Rem
 * @date 2022-11-27
 */
public abstract class LiftState {
    /**
     * 定义一个环境角色，也就是封装状态的变化引起的功能变化
     */
    protected Context context;

    public void setContext(Context context) {
        this.context = context;
    }

    /**
     * 电梯开门动作
     */
    public abstract void open();

    /**
     * 电梯关门动作
     */
    public abstract void close();

    /**
     * 电梯运行动作
     */
    public abstract void run();

    /**
     * 电梯停止动作
     */
    public abstract void stop();

}

/**
 * 开启状态
 * 电梯只能关闭
 */
class OpenningState extends LiftState {

    @Override
    public void open() {
        System.out.println("电梯门开启...");
    }

    @Override
    public void close() {
        super.context.setLiftState(Context.CLOSING_STATE).close();
    }

    @Override
    public void run() {
    }

    @Override
    public void stop() {
    }
}

class ClosingState extends LiftState {

    @Override
    public void close() {
        System.out.println("电梯门关闭...");
    }

    @Override
    public void open() {
        super.context.setLiftState(Context.OPENNING_STATE).open();
    }

    @Override
    public void run() {
        super.context.setLiftState(Context.RUNNING_STATE).run();
    }

    @Override
    public void stop() {
        super.context.setLiftState(Context.STOPPING_STATE).stop();
    }
}

/**
 * 运行状态
 * 电梯只能停止
 */
class RunningState extends LiftState {

    @Override
    public void open() {
    }

    @Override
    public void close() {
    }

    @Override
    public void run() {
        System.out.println("电梯正在运行...");
    }

    @Override
    public void stop() {
        super.context.setLiftState(Context.STOPPING_STATE).stop();
    }
}

/**
 * 停止状态
 * 可以开门、关门、运行
 */
class StoppingState extends LiftState {

    @Override
    public void open() {
        super.context.setLiftState(Context.OPENNING_STATE).open();
    }

    @Override
    public void close() {
        super.context.setLiftState(Context.CLOSING_STATE).close();
    }

    @Override
    public void run() {
        super.context.setLiftState(Context.RUNNING_STATE).run();
    }

    @Override
    public void stop() {
        System.out.println("电梯停止了...");
    }
}